package com.lanren.common.utils;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Build;
import android.support.v4.content.FileProvider;
import android.telephony.TelephonyManager;
import android.util.Log;

import java.io.File;
import java.lang.reflect.Method;
import java.util.UUID;

/**
 * 跟app相关的工具类
 *
 * @author wanghuaiqiang
 */
@SuppressWarnings({"JavaDoc", "unused"})
public class AppUtils {
    private static final String TAG = "AppUtils";

    private static Context context;
    private static Boolean isDebug = null;

    /**
     * 本工具类初始化
     *
     * @param context
     */
    public static void init(Context context) {
        AppUtils.context = context;
        syncIsDebug(context);
    }

    public static int getVersionCode() {
        int verCode = -1;
        try {
            verCode = context.getPackageManager().getPackageInfo(
                    context.getPackageName(), 0).versionCode;
        } catch (Exception e) {
            LogUtils.e(TAG, "获取本应用版本号出错: " + e);
        }
        return verCode;
    }

    public static String getVersionName() {
        String versionName = "";
        try {
            PackageManager pm = context.getPackageManager();
            PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0);
            versionName = pi.versionName;
            if (versionName == null || versionName.length() <= 0) {
                return "";
            }
        } catch (Exception e) {
            Log.e("VersionInfo", "Exception" + e);
        }
        return versionName;
    }

    public static final String getPkg(Context ctx) {
        return ctx.getPackageName();
    }

    /**
     * 未加密
     *
     * @return 设备ID
     */
    @SuppressLint("HardwareIds")
    public static String getAndroidID() {
        return "" + android.provider.Settings.Secure.getString(context.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
    }

    @SuppressLint({"ByteOrderMark", "HardwareIds", "MissingPermission"})
    public static String getAndroidID2() {
        final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);

//        mSerial = "" + tm.getSimSerialNumber();//SIM卡的序列号
//        getSimOperatorName() ﻿Returns the Service Provider Name (SPN).
//                               获取服务提供商名字，比如电信，联通，移动
//        String imsi = telManager.getSubscriberId();
//        if(imsi!=null){ if(imsi.startsWith(“46000″) || imsi.startsWith(“46002″))
//        {因为移动网络编号46000下的IMSI已经用完，所以虚拟了一个46002编号，
//           134/159号段使用了此编号 //中国移动
//        }else if(imsi.startsWith(“46001″)){
//         中国联通
//        }else if(imsi.startsWith(“46003″)){
//        中国电信
//        } }
//        getCellLocation（） 返回的单元格位置的装置 ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION
//        getLine1Number（） 返回设备的电话号码（MSISDN号码） READ_PHONE_STATE
//        getNetworkOperatorName（） 返回注册的网络运营商的名字
//        getNetworkOperator（） 返回的MCC +跨国公司的注册网络运营商
//        getNetworkCountryIso（） 返回注册的网络运营商的国家代码
//        getSimCountryIso（） 返回SIM卡运营商的国家代码 READ_PHONE_STATE
//        getSimOperator（） 返回SIM卡运营商的单个核细胞数+冶 READ_PHONE_STATE
//        getSimOperatorName（） 返回SIM卡运营商的名字 READ_PHONE_STATE
//        getSimSerialNumber（） 返回SIM卡的序列号 READ_PHONE_STATE
//        getNetworkType（） 返回网络设备可用的类型。
        return tm.getDeviceId();//设备ID
    }

    /**
     * UUID 加密过后
     *
     * @return android唯一标识
     */
    public static String getUUIDAndroidID(String androidID, String deviceID, String tmSerial) {
        UUID deviceUuid = new UUID(androidID.hashCode(), ((long) deviceID.hashCode() << 32) | tmSerial.hashCode());
        return deviceUuid.toString();
    }

    /**
     * 手机厂商
     *
     * @return
     */
    public static String getPhoneProducer() {
        return android.os.Build.BRAND;
    }

    /**
     * 手机IM
     *
     * @return
     */
    @SuppressLint("MissingPermission")
    public static String getIMEI() {
        TelephonyManager tm = (TelephonyManager) context.getSystemService(Activity.TELEPHONY_SERVICE);
        if (tm != null) {
            return tm.getDeviceId();
        }

        return null;
    }

    /**
     * 获取手机型号
     *
     * @return
     */
    public static String getPhoneModel() {
        return android.os.Build.MODEL;
    }

    /**
     * 获取系统版本号
     *
     * @return
     */
    public static String getSystemVersion() {
        return android.os.Build.VERSION.RELEASE;
    }

    /**
     * SDK 版本
     *
     * @return
     */
    public static String getSDKVersion() {
        return android.os.Build.VERSION.SDK;
    }

    /**
     * 获取导航栏高度
     *
     * @return
     */
    private static int getNavigationBarHeight() {
        Resources resources = context.getResources();
        int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
        int height = resources.getDimensionPixelSize(resourceId);
        Log.v("dbw", "Navi height:" + height);
        return height;
    }

    /**
     * 检查设备是否有导航栏
     *
     * @param context
     * @return
     */
    @SuppressWarnings({"unchecked", "EmptyCatchBlock"})
    public static boolean checkDeviceHasNavigationBar(Context context) {
        boolean hasNavigationBar = false;
        Resources rs = context.getResources();
        int id = rs.getIdentifier("config_showNavigationBar", "bool", "android");
        if (id > 0) {
            hasNavigationBar = rs.getBoolean(id);
        }
        try {
            Class systemPropertiesClass = Class.forName("android.os.SystemProperties");
            Method m = systemPropertiesClass.getMethod("get", String.class);
            String navBarOverride = (String) m.invoke(systemPropertiesClass, "qemu.hw.mainkeys");
            if ("1".equals(navBarOverride)) {
                hasNavigationBar = false;
            } else if ("0".equals(navBarOverride)) {
                hasNavigationBar = true;
            }
        } catch (Exception e) {
        }
        return hasNavigationBar;
    }


    public static boolean isDebug() {
        return isDebug == null ? false : isDebug.booleanValue();
    }

    /**
     * Sync lib debug with app's debug value. Should be called in module Application
     *
     * @param context
     */
    public static void syncIsDebug(Context context) {
        if (isDebug == null) {
            isDebug = context.getApplicationInfo() != null &&
                    (context.getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
        }
    }

    public static void installApk(Context context, String downloadApk, String fileprovider) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        File file = new File(downloadApk);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            Uri apkUri = FileProvider.getUriForFile(context, fileprovider, file);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
        } else {
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            Uri uri = Uri.fromFile(file);
            intent.setDataAndType(uri, "application/vnd.android.package-archive");
        }
        context.startActivity(intent);

    }
}
